#include "DRV_Timer2.h"

volatile unsigned long long FreeRTOSRunTimeTicks;

/*******************************************************************************
* Function Name  : Timer_Init
* Description    : 统计任务定时器
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void Timer_Init(uint16_t TIM_Period, uint16_t TIM_Prescaler)
{
	//RCC打开时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	
	//选择时基单元的时钟，内部时钟一般默认初始化可以写可以不写
	TIM_InternalClockConfig(TIM2);
	
	//配置时基单元
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    
	//TIM_CKD_DIV1代表1分屏
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    
	//代表向上计数
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInitStructure.TIM_Period = TIM_Period;
    
	//72MHZ分频7200，就是10k,10k计10000个数就是1s
	TIM_TimeBaseInitStructure.TIM_Prescaler = TIM_Prescaler;
    
	//高级定时器才有，现在是通用定时器给0
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
	
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);
	
	//如果不加入这一句，会导致复位之后从1开始计数
	TIM_ClearFlag(TIM2, TIM_FLAG_Update);
	
	//TIM_IT_Update代表更新中断，中断控制，用来控制某个中断能不能通往NIVC
	TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
	
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel                   = TIM2_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd                = ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 4;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority        = 0;
	NVIC_Init(&NVIC_InitStructure);
	
	//启动定时器
	TIM_Cmd(TIM2, ENABLE);
}

/*******************************************************************************
* Function Name  : ConfigureTimeForRunTimeStats
* Description    : 统计任务定时器初始化
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void ConfigureTimeForRunTimeStats(void)
{
    //初始化定时器10us
	Timer_Init(10-1,72-1);
	
	FreeRTOSRunTimeTicks=0;
}

/*******************************************************************************
* Function Name  : TIM2_IRQHandler
* Description    : 统计任务定时器中断处理函数
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void TIM2_IRQHandler(void)
{
    if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)  //检查TIM2更新中断发生与否
    {
        FreeRTOSRunTimeTicks++;
        TIM_ClearITPendingBit(TIM2, TIM_IT_Update  );   //清除TIMx更新中断标志 
    }   
}
